const fs = require('fs');
const verify = require('./lib_verify.js');
const controllerCommon = require('./lib_controller.js');


module.exports = async function () {
    const path = CTX.request.path;//获取请求地址
    if(path.indexOf('favicon.ico')>-1){
        CTX.throw(404)
        return;
    }
    let filepath = AppPath + "/controller" + path + ".js";//获取本地地址
    filepath = filepath.replace(/\//g, "\\");

    try {
        fs.accessSync(filepath, fs.constants.R_OK | fs.constants.W_OK);//本地文件是否存在
        try {
            const res = require(filepath);//加载对应控制器脚本
            let controller = new res();//生成控制器实例
            let action = CTX.query.action ? CTX.query.action : 'index';//获取控制器行为方法名，默认为index
            //controller.ctx = ctx;//继承控制器ctx对象
            controller.verify = verify;//继承数据验证对象
            controller.display = CTX.render;//渲染视图模板
            GET = CTX.query;//继承GET数据对象
            POST = CTX.request.body;//继承POST数据对象
            FILES = CTX.request.files;//上传文件信息
            controllerCommon.exports(controller);//绑定公共方法

            if (controller._rules_ && controller._rules_[action]){//控制器中是否存在配置验证规则
                let verifyRes = controller.verify(controller._rules_[action]);//验证数据
                if (verifyRes != true) {
                    setbody(controllerCommon.error(verifyRes));//未通过验证时，输出验证结果
                    return;
                }
            }
            if (controller[action]){//是否存在方法
                try {
                    setbody(await controller[action]());//执行方法
                } catch (err) {
                    err.position = path.substr(1,path.length)+'控制器中' + action + ' 方法出错';
                    setbody(controllerCommon.error(err));
                }
            }else{
                let err={}
                err.position = path.substr(1,path.length)+' 控制器中 '+action+'  方法不存在';
                setbody(controllerCommon.error(err));
            }
         } catch (err) {
            err.position = path.substr(1,path.length)+' 控制器文件出错了';
            setbody(controllerCommon.error(err));
        }
    } catch (err) {
        CTX.response.status = 404;
        err.position = '没有发现控制器文件';
        setbody(controllerCommon.error(err));
    }

    function setbody(content) {
        CTX.body=content;
        CTX.app.emit('error',content);
    }
}

//跳转至404
function to404() {
    CTX.redirect('back', '/404.html')
    return 'not fount 404';
}


